/**
 * Copyright @2012 中国电信甘肃万维公司 All rights reserved.
 * 中国电信甘肃万维公司 专有/保密源代码,未经许可禁止任何人通过任何* 渠道使用、修改源代码.
 * 日期 2012-7-26 下午05:20:12
 */
package com.oa.cs.agreement.pojo;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import com.oa.cs.agreement.util.MapConverter;

/**
 * <p>
 * ResponseObject描述:响应对象基类
 * </p>
 * @company 中国电信甘肃万维公司 
 *
 * @project nma-s-agreement
 *
 * @version V2.0.0
 *
 * @author 郭磊(产品部)
 *
 * @date 2012-7-26 下午05:20:12	
 *
 * @class com.oa.s.agreement.pojo.ResponseObject
 *
 */
public class ResponseObject extends AgreementPojo implements IResponseObject
{
	/** 
	 *  serialVersionUID :  TODO 序列化ID
	 */
	private static final long serialVersionUID = -2408588712560584163L;

	/** 
	 *  success :  TODO 本次请求是否成功,默认值：SUCCESS_OK	success = IResponseObject.SUCCESS_ENUM.SUCCESS_OK.getValue()
	 */
	private byte success = IResponseObject.SUCCESS_ENUM.SUCCESS_OK.getValue();
	
	/** 
	 *  msg :  TODO 本次请求的提示消息,默认值：空字符串		msg = BLANK_STR
	 */
	private String msg = BLANK_STR;
	
	/** 
	 *  data :  TODO 本次请求返回的具体数据体,默认值：null		data = null
	 */
	private Map<String,Object> data = new LinkedHashMap<String,Object>();

	/** 
	 *  converter :  TODO Map转换器
	 */
	private MapConverter<Object> converter = new MapConverter<Object>(data);
	
	/**
	 * <p>TODO 无参构造</p>
	 */
	public ResponseObject()
	{
		
	}
	
	/**
	 * <p>TODO：用于无返回值的构造</p>
	 * @param success 是否成功
	 * @param msg 消息
	 */
	public ResponseObject(byte success , String msg)
	{
		this.success = success;
		this.msg = msg;
	}
	
	/**
	 * <p>TODO: 用于含返回值的构造</p>
	 * @param success 是否成功
	 * @param msg 消息
	 * @param data 返回值
	 */
	public ResponseObject(byte success , String msg , Map<String,Object> data)
	{
		this(success , msg);
		if(data != null)
		{
			this.data = data;
		}
	}

	public byte getSuccess()
	{
		return success;
	}

	public void setSuccess(byte success)
	{
		this.success = success;
	}

	public String getMsg()
	{
		return msg;
	}

	public void setMsg(String msg)
	{
		this.msg = msg;
	}
	
	public Map<String,Object> getData()
	{
		return data;
	}

	public void setData(Map<String,Object> data)
	{
		this.converter.setData(data);
		this.data = data;
	}
	
	public void setParameter(String key , Object value)
	{
		this.converter.setParameter(key, value);
	}
	
	public void setParameters(Map<String,Object> parameters)
	{
		this.converter.setParameters(parameters);
	}
	
	/**
	 * TODO 获取参数
	 * @param key 参数key
	 * @return 参数值
	 */
	public Object getParameter(String key)
	{
		return this.converter.getParameter(key);
	}
	
	/**
	 * TODO 获取参数，如果该参数不存在则返回defaultValue
	 * @param key 参数key
	 * @param defaultValue
	 * @return 参数值
	 */
	public Object getParameter(String key , Object defaultValue)
	{
		return this.converter.getParameter(key,defaultValue);
	}
	
	/**
	 * TODO 获取一个整型值
	 * @param key 参数key
	 * @return 参数值
	 */
	public Integer getInteger(String key)
	{
		return this.converter.getInteger(key);
	}
	
	/**
	 * TODO 获取一个长整型值
	 * @param key 参数key
	 * @return 参数值
	 */
	public Long getLong(String key)
	{
		return this.converter.getLong(key);
	}
	
	/**
	 * TODO 获取一个浮点型
	 * @param key 参数key
	 * @return 参数值
	 */
	public Float getFloat(String key)
	{
		return this.converter.getFloat(key);
	}
	
	/**
	 * TODO 获取一个双精度型
	 * @param key 参数key
	 * @return 参数值
	 */
	public Double getDouble(String key)
	{
		return this.converter.getDouble(key);
	}
	
	/**
	 * TODO 获取一个字节型
	 * @param key 参数key
	 * @return 参数值
	 */
	public Byte getByte(String key)
	{
		return this.converter.getByte(key);
	}
	
	/**
	 * TODO 获取一个字符串型
	 * @param key 参数key
	 * @return 参数值
	 */
	public String getString(String key)
	{
		return this.converter.getString(key);
	}
	
	/**
	 * TODO 获取一个Map型
	 * @param key 参数key
	 * @return 参数值
	 */
	public Map<String,String> getMap(String key)
	{
		return this.converter.getMap(key);
	}
	
	/**
	 * TODO 获取一个Map型
	 * @param key 参数key
	 * @return 参
	 */
	public List<Map<String,String>> getList(String key)
	{
		return this.converter.getList(key);
	}
	
	/**
	 * TODO 格式化Response信息
	 * @return 格式化后的字符串
	 */
	public String formatReponse()
	{
		StringBuffer sb = new StringBuffer();
		sb.append("--ResponseObject ---------  ");
		sb.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
		sb.append("  --------start \n");
		sb.append("(success) : [" + this.success +"]\n");
		sb.append("(msg) : [" + (this.msg == null ? "null" : this.msg) +"]\n");
		if(this.data != null && !this.data.isEmpty())
		{
			sb.append("(data) : \n");
			Set<Entry<String, Object>> set = this.data.entrySet();
			for (Entry<String, Object> entry : set)
			{
				String key = entry.getKey();
				Object value = entry.getValue();
				sb.append("\t");
				sb.append(key == null ? "null" : key);
				sb.append("=");
				sb.append(value == null ? "null" : value);
				sb.append("\n");
			}
		}
		else
		{
			sb.append("(data) : [null]\n");
		}
		sb.append("============================================= end\n");
		return sb.toString();
	}
	
	/**
	 * TODO 格式化并打印当前对象的信息
	 */
	public void print(OutputStream os)
	{
		String info = this.formatReponse();
		DataOutputStream dos = new DataOutputStream(os);
		try
		{
			dos.write(info.getBytes("UTF-8"));
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
}
